package entidades;

import java.util.HashMap;
import entidades.interfaces.ITelhaBaseVisitante;
import gestordeentidades.persistance.DataBaseObject;
import javafx.beans.property.ObjectProperty;
import javafx.collections.ObservableList;

/**
 * Trabalho DAS - 2014/2015
 * @author a21210380, a21190325, a21210392
 */
public class Decorador extends TelhaBase {
    public final static Integer VALOR_COR_LINHA = 1;
    public final static Integer VALOR_FUNDO = 2;
    public final static Integer VALOR_COR_TEXTO = 3;
    public final HashMap<Integer, DataBaseObject> valores = new HashMap<>();
    
    private TelhaBase telhaBase;
    private String nome;
    
    public Decorador(String nome, TelhaBase telhaBase, Cor corLinha, Cor corTexto, Textura textura) {
        this.telhaBase = telhaBase;
        this.nome = nome;
        
        if(corLinha != null)
            valores.put(VALOR_COR_LINHA, corLinha);
        
        if(corTexto != null)
            valores.put(VALOR_COR_TEXTO, corTexto);
        
        if(textura != null)
            valores.put(VALOR_FUNDO, textura);
    }

    public TelhaBase getTelhaDecorada() {
        return telhaBase;
    }
    
    public TelhaBase setTelhaDecorada(TelhaBase telhaBase) {
        this.telhaBase = telhaBase;
        return this;
    }
    
    public String getNomeDecorador() {
        return nome;
    }
    
    public HashMap<Integer, DataBaseObject> getValores() {
        return valores;
    }
    
    @Override
    public Cor getCorDaLinha() {
        if(valores.containsKey(VALOR_COR_LINHA)) {
            return (Cor)valores.get(VALOR_COR_LINHA);
        }
        return telhaBase.getCorDaLinha();
    }

    @Override
    public Cor getCorDoTexto() {
        if(valores.containsKey(VALOR_COR_TEXTO)) {
            return (Cor)valores.get(VALOR_COR_TEXTO);
        }
        return telhaBase.getCorDoTexto();
    }

    @Override
    public Textura getFundo() {
        if(valores.containsKey(VALOR_FUNDO)) {
            return (Textura)valores.get(VALOR_FUNDO);
        }
        return telhaBase.getFundo();
    }

    @Override
    public void setCorDaLinha(Cor cor) {
        if(valores.containsKey(VALOR_COR_LINHA)) {
            valores.put(VALOR_COR_LINHA, cor);
        } else {
            telhaBase.setCorDaLinha(cor);
        }
    }

    @Override
    public void setCorDoTexto(Cor cor) {
        if(valores.containsKey(VALOR_COR_TEXTO)) {
            valores.put(VALOR_COR_TEXTO, cor);
        } else {
            telhaBase.setCorDoTexto(cor);
        }
    }

    @Override
    public void setFundo(Textura textura) {
        if(valores.containsKey(VALOR_FUNDO)) {
            valores.put(VALOR_FUNDO, textura);
        } else {
            telhaBase.setFundo(textura);
        }
    }
    
    @Override
    public String getNomeDoEstilo() {
        return telhaBase.getNomeDoEstilo() + " " + nome;
    }

    @Override
    public void setNomeDoEstilo(String nome) {
        this.nome = nome;
    }
    
    @Override
    public Rectangulo getRectangulo() {
        return telhaBase.getRectangulo();
    }
    
    @Override
    public boolean adicionarAncora(Ancora ancora) {
        return telhaBase.adicionarAncora(ancora);
    }

    @Override
    public boolean removerAncora(Ancora ancora) {
        return telhaBase.adicionarAncora(ancora);
    }
    
    @Override
    public ObservableList<Ancora> getAncoras() {
        return telhaBase.getAncoras();
    }
    
    @Override
    public TipoTelha getTipoDeTelha() {
        return telhaBase.getTipoDeTelha();
    }

    @Override
    public TelhaBase setTipoDeTelha(TipoTelha tipoDeTelha) {
        return telhaBase.setTipoDeTelha(tipoDeTelha);
    }

    @Override
    public Familia getFamilia() {
        return telhaBase.getFamilia();
    }

    @Override
    public DesenhoDinamico getDesenho() {
        return telhaBase.getDesenho();
    }
    
    @Override
    public ObjectProperty<Cor> corLinhaProperty() {
        return telhaBase.corLinhaProperty();
    }
    
    @Override
    public ObjectProperty<Cor> corTextoProperty() {
        return telhaBase.corTextoProperty();
    }
    
    @Override
    public ObjectProperty<Textura> fundoProperty() {
        return telhaBase.fundoProperty();
    }
    
    @Override
    public void mover(float x, float y) {
        telhaBase.mover(x, y);
    }
    
    @Override
    public void resize(float x, float y) {
        telhaBase.resize(x, y);
    }

    @Override
    public void accept(ITelhaBaseVisitante visitor) {
        visitor.visitante(this);
    }
    
    @Override
    public void acceptChain(ITelhaBaseVisitante visitor) {
        visitor.visitante(this);
        telhaBase.acceptChain(visitor);
    }
    
    @Override
    public TelhaBase clone() {
        Textura textura = null;
        Cor corLinha = null;
        Cor corTexto = null;
        if(valores.containsKey(VALOR_FUNDO)) {
            textura = new Textura((Textura)valores.get(VALOR_FUNDO));
        }
        if(valores.containsKey(VALOR_COR_LINHA)) {
            corLinha = (Cor)valores.get(VALOR_COR_LINHA);
        }
        if(valores.containsKey(VALOR_COR_TEXTO)) {
            corTexto = (Cor)valores.get(VALOR_COR_TEXTO);
        }
        
        return new Decorador(nome, telhaBase.clone(), corLinha, corTexto, textura);
    }
}
